using System;
using System.Collections.Generic;
using System.Text;

namespace Workflows.Components
{
    public class DataPipeTypeChecker
    {
        public static bool CanAccept(Type[] acceptableTypes, Type subjectType)
        {
            bool accept = false;
            for (int i = 0; i < acceptableTypes.Length; i++)
            {
                if (IsCompatible(subjectType, acceptableTypes[i]))
                {
                    accept = true;
                    break;
                }
            }
            return accept;
        }

        public static bool IsCompatible(Type fromType, Type toType)
        {
            if (fromType == toType)
                return true;
            if (toType == Type.Missing.GetType())
                return true;

            bool compatible = false;
            //switch (fromType)
            //{
            //    case DataPipeType.BooleanType:
            //        switch (toType)
            //        {
            //            case DataPipeType.BooleanType:
            //                compatible = true;
            //                break;
            //            case DataPipeType.CollectionType:
            //                break;
            //            case DataPipeType.DateTimeType:
            //                break;
            //            case DataPipeType.NotDefined:
            //                break;
            //            case DataPipeType.NullType:
            //                compatible = true;
            //                break;
            //            case DataPipeType.NumberType:
            //                compatible = true;
            //                break;
            //            case DataPipeType.StringType:
            //                compatible = true;
            //                break;
            //            case DataPipeType.TableType:
            //                break;
            //        }
            //        break;
            //    case DataPipeType.CollectionType:
            //        switch (toType)
            //        {
            //            case DataPipeType.BooleanType:
            //                break;
            //            case DataPipeType.CollectionType:
            //                compatible = true;
            //                break;
            //            case DataPipeType.DateTimeType:
            //                break;
            //            case DataPipeType.NotDefined:
            //                break;
            //            case DataPipeType.NullType:
            //                compatible = true;
            //                break;
            //            case DataPipeType.NumberType:
            //                break;
            //            case DataPipeType.StringType:
            //                compatible = true;
            //                break;
            //            case DataPipeType.TableType:
            //                compatible = true;
            //                break;
            //        }
            //        break;
            //    case DataPipeType.DateTimeType:
            //        switch (toType)
            //        {
            //            case DataPipeType.BooleanType:
            //                break;
            //            case DataPipeType.CollectionType:
            //                break;
            //            case DataPipeType.DateTimeType:
            //                break;
            //            case DataPipeType.NotDefined:
            //                break;
            //            case DataPipeType.NullType:
            //                compatible = true;
            //                break;
            //            case DataPipeType.NumberType:
            //                break;
            //            case DataPipeType.StringType:
            //                compatible = true;
            //                break;
            //            case DataPipeType.TableType:
            //                break;
            //        }
            //        break;
            //    case DataPipeType.NotDefined:
            //        switch (toType)
            //        {
            //            case DataPipeType.BooleanType:
            //                break;
            //            case DataPipeType.CollectionType:
            //                break;
            //            case DataPipeType.DateTimeType:
            //                break;
            //            case DataPipeType.NotDefined:
            //                break;
            //            case DataPipeType.NullType:
            //                compatible = true;
            //                break;
            //            case DataPipeType.NumberType:
            //                break;
            //            case DataPipeType.StringType:
            //                break;
            //            case DataPipeType.TableType:
            //                break;
            //        }
            //        break;
            //    case DataPipeType.NullType:
            //        switch (toType)
            //        {
            //            case DataPipeType.BooleanType:
            //                break;
            //            case DataPipeType.CollectionType:
            //                break;
            //            case DataPipeType.DateTimeType:
            //                break;
            //            case DataPipeType.NotDefined:
            //                break;
            //            case DataPipeType.NullType:
            //                compatible = true;
            //                break;
            //            case DataPipeType.NumberType:
            //                break;
            //            case DataPipeType.StringType:
            //                break;
            //            case DataPipeType.TableType:
            //                break;
            //        }
            //        break;
            //    case DataPipeType.NumberType:
            //        switch (toType)
            //        {
            //            case DataPipeType.BooleanType:
            //                compatible = true;
            //                break;
            //            case DataPipeType.CollectionType:
            //                break;
            //            case DataPipeType.DateTimeType:
            //                break;
            //            case DataPipeType.NotDefined:
            //                break;
            //            case DataPipeType.NullType:
            //                compatible = true;
            //                break;
            //            case DataPipeType.NumberType:
            //                compatible = true;
            //                break;
            //            case DataPipeType.StringType:
            //                compatible = true;
            //                break;
            //            case DataPipeType.TableType:
            //                break;
            //        }
            //        break;
            //    case DataPipeType.StringType:
            //        switch (toType)
            //        {
            //            case DataPipeType.BooleanType:
            //                compatible = true;
            //                break;
            //            case DataPipeType.CollectionType:
            //                break;
            //            case DataPipeType.DateTimeType:
            //                compatible = true;
            //                break;
            //            case DataPipeType.NotDefined:
            //                break;
            //            case DataPipeType.NullType:
            //                compatible = true;
            //                break;
            //            case DataPipeType.NumberType:
            //                compatible = true;
            //                break;
            //            case DataPipeType.StringType:
            //                compatible = true;
            //                break;
            //            case DataPipeType.TableType:
            //                break;
            //        }
            //        break;
            //    case DataPipeType.TableType:
            //        switch (toType)
            //        {
            //            case DataPipeType.BooleanType:
            //                break;
            //            case DataPipeType.CollectionType:
            //                compatible = true;
            //                break;
            //            case DataPipeType.DateTimeType:
            //                break;
            //            case DataPipeType.NotDefined:
            //                break;
            //            case DataPipeType.NullType:
            //                compatible = true;
            //                break;
            //            case DataPipeType.NumberType:
            //                break;
            //            case DataPipeType.StringType:
            //                break;
            //            case DataPipeType.TableType:
            //                compatible = true;
            //                break;
            //        }
            //        break;
            //}
            return compatible;
        }
    }
}
